package com.gomefinance.hl.elasticjob.config;

import com.dangdang.ddframe.job.api.dataflow.DataflowJob;
import com.dangdang.ddframe.job.config.JobCoreConfiguration;
import com.dangdang.ddframe.job.config.dataflow.DataflowJobConfiguration;
import com.dangdang.ddframe.job.lite.api.JobScheduler;
import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;

/**
 *
 * <h2>不适用spring 容器的情况下，开启elastic job 定时任务</h2>
 * 1.创建、配置、初始化注册中心(zookeeper注册中心)<br/>
 * 2.创建任务类 （流式任务 JavaDataflowJob）
 * 3.配置任务的相关信息（）
 * 4.创建任务控制器scheduler  开启任务
 * @Author hzj
 * @Date 2017/8/23 16:36
 * @Description :
 */
public class JavaJobConfig {


    /**
     * 创建任务控制器
     * @param clzz
     * @param cron
     * @param shardingTotalCount
     * @param shardingItemParameters
     * @param regCenter
     * @return
     */
    public JobScheduler dataflowJobScheduler(final Class clzz, final String cron, final int shardingTotalCount, final String shardingItemParameters, ZookeeperRegistryCenter regCenter) {
        return new JobScheduler(regCenter, getLiteJobConfiguration(clzz, cron, shardingTotalCount, shardingItemParameters));
    }


    /**
     * 创建JobConfiguration 任务的配置信息<br/>
     * <p>
     * <p>
     * Elastic-Job配置分为3个层级，分别是Core, Type和Root。每个层级使用相似于装饰者模式的方式装配。<br/>
     * <p>
     * Core对应JobCoreConfiguration，用于提供作业核心配置信息，如：作业名称、分片总数、CRON表达式等。<br/>
     * <p>
     * Type对应JobTypeConfiguration，有3个子类分别对应SIMPLE, DATAFLOW和SCRIPT类型作业，提供3种作业需要的不同配置，如：DATAFLOW类型是否流式处理或SCRIPT类型的命令行等。<br/>
     * <p>
     * Root对应JobRootConfiguration，有2个子类分别对应Lite和Cloud部署类型，提供不同部署类型所需的配置，如：Lite类型的是否需要覆盖本地配置或Cloud占用CPU或Memory数量等。<br/>
     * <p>
     * 1、定义作业核心配置 <br/>
     * 2、定义DATAFLOW类型配置 <br/>
     * 3、定义Lite作业根配置<br/>
     *
     * @param jobClass               任务类
     * @param cron                   任务执行的表达式
     * @param shardingTotalCount     分片总数
     * @param shardingItemParameters 分片项参数
     * @return liteJobConfiguration 的任务配置
     */
    private LiteJobConfiguration getLiteJobConfiguration(final Class<? extends DataflowJob> jobClass, final String cron, final int shardingTotalCount, final String shardingItemParameters) {
        return LiteJobConfiguration.newBuilder(
                new DataflowJobConfiguration(JobCoreConfiguration.newBuilder(jobClass.getName(), cron, shardingTotalCount).shardingItemParameters(shardingItemParameters).build(), jobClass.getCanonicalName(), true)
        ).overwrite(true).build();
    }

}
